const router = require('express').Router()
const sql = require('./../sql')
const User = require('../sql/models/User.js')
const utils = require('./../utils/index')

/**
 * @api {post} /api/users/validateTel 验证手机号是否可以继续注册
 * @apiName PostValidateTel
 * @apiGroup User
 * 
 * @apiParam {string} tel 手机号
 * 
 * @apiSuccess {String} code 状态码.
 * @apiSuccess {String} message  描述
 *
 * @apiHeader {String} token token
 * 
 * @apiSuccessExample Success-Response:
 *     HTTP/1.1 200 OK
 *     {
 *       "code": "200" || "10001",
 *       "message": "可以继续注册" || "该用户已注册",
 *     }
 * @apiSampleRequest /api/users/validateTel
 */
router.post('/validateTel', (req, res, next) => {
  const { tel } = req.body
  sql.find(User, { tel }, { _id: 0, __v: 0 }).then(data1 => {
    if (data1.length === 0) { // 没有查找到该用户
      res.status(200).send({
        code: '200',
        message: '可以继续注册'
      })
    } else {
      if (data1[0].password === '') { // 没有设置密码 - 未完成注册
        res.status(200).send({
          code: '200',
          message: '可以继续注册'
        })
      } else { // 该用户已注册
        res.status(200).send({
          code: '10001',
          message: '该用户已注册'
        })
      }
    }
  })
})

/**
 * @api {post} /api/users/sendCode 发送短信验证码
 * @apiName PostSendCode
 * @apiGroup User
 * 
 * @apiParam {string} tel 手机号
 * 
 * @apiSuccess {String} code 状态码.
 * @apiSuccess {String} message  描述
 *
 * @apiHeader {String} token token
 * 
 * @apiSuccessExample Success-Response:
 *     HTTP/1.1 200 OK
 *     {
 *       "code": "200" ,
 *       "message": "发送短信验证码"
 *     }
 * @apiSampleRequest /api/users/sendCode
 */
router.post('/sendCode', (req, res, next) => {
  const { tel } = req.body

  // 严格来讲，还需要验证一次手机号的可用性
  const telcode = utils.randomCode()

  utils.sendCode(tel, telcode)
    .then(() => {
      // 发送短信验证码成功  ----  插入数据
      // 如果手机号不存在  ---- 插入数据
      // 如果手机号存在  密码不存在   --- 更新数据
      sql.find(User, { tel }, { _id: 0, __v: 0 }).then(data1 => {
        if (data1.length === 0) {// 如果手机号不存在  ---- 插入数据
          const insertData = {
            userid: 'user_' + utils.getUuid(),
            username: '',
            nickname: utils.randomNickname(),
            tel,
            telcode,
            password: '',
            email: '',
            sex: -1,
            birthday: '',
            avatar: 'https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1488280602,1416445856&fm=26&gp=0.jpg',
            regtime: new Date()
          }

          sql.insert(User, insertData).then(() => {
            res.status(200).send({
              code: '200',
              message: '短信验证码已发送'
            })
          })
        } else {
          if (data1[0].password === '') {// 如果手机号存在  密码不存在   --- 更新数据
            sql.update(User, { tel }, { $set: { telcode }}).then(() => {
              res.status(200).send({
                code: '200',
                message: '短信验证码已发送'
              })
            })
          }
        }
      })
    })
})
/**
 * @api {post} /api/users/validateTelCode 验证短信验证码
 * @apiName PostValidateTelCode
 * @apiGroup User
 * 
 * @apiParam {string} tel 手机号
 * @apiParam {string} telcode 验证码
 * 
 * @apiHeader {String} token token
 * 
 * @apiSuccess {String} code 状态码.
 * @apiSuccess {String} message  描述
 *
 * @apiSuccessExample Success-Response:
 *     HTTP/1.1 200 OK
 *     {
 *       "code": "200" || "10002",
 *       "message": "验证码输入通过" || "验证码输入错误"
 *     }
 * @apiSampleRequest /api/users/validateTelCode
 */
router.post('/validateTelCode', (req, res, next) => {
  const { tel, telcode } = req.body

  sql.find(User, { tel, telcode }, { _id: 0, __v: 0 }).then(data => {
    if (data.length === 0) { // 验证码错误
      res.status(200).send({
        code: '10002',
        message: '验证码输入错误'
      })
    } else { // 验证码通过
      res.status(200).send({
        code: '200',
        message: '验证码验证通过'
      })
    }
  })
 })
/**
 * @api {post} /api/users/register 注册
 * @apiName PostRegister
 * @apiGroup User
 * 
 * @apiParam {string} tel 手机号
 * @apiParam {string} password 密码
 * 
 * @apiSuccess {String} code 状态码.
 * @apiSuccess {String} message  描述
 *
 * @apiHeader {String} token token
 * 
 * @apiSuccessExample Success-Response:
 *     HTTP/1.1 200 OK
 *     {
 *       "code": "200",
 *       "message": "注册成功" 
 *     }
 * @apiSampleRequest /api/users/register
 */
router.post('/register', (req, res, next) => {
  let { tel, password } = req.body
  // 密码一般都要加密
  utils.encryption(password).then(result => {
    sql.update(User, { tel }, { $set: { password: result }}).then(() => {
      res.status(200).send({
        code: '200',
        message: '注册成功'
      })
    })
  })
})


/**
 * @api {get} /api/users/list 获取用户列表
 * @apiName list
 * @apiGroup User
 * 
 * @apiParam {string} tel 手机号
 * @apiParam {string} password 密码
 * 
 * @apiHeader {String} token token
 * 
 * @apiSuccess {String} code 状态码.
 * @apiSuccess {String} message  描述
 *
 * @apiSuccessExample Success-Response:
 *     HTTP/1.1 200 OK
 *     {
 *       "code": "200",
 *       "message": "获取用户列表" 
 *     }
 * @apiSampleRequest /api/users/list
 */
router.get('/list',(req,res,next)=>{
  sql.find(User).then((data)=>{
    res.status(200).send({
      code: '200',
      message: '获取用户列表',
      data
    })
  })
})

/**
 * @api {post} /api/users/login 登录
 * @apiName PostUserLogin
 * @apiGroup User
 * 
 * @apiParam {string} loginname 手机号/用户名
 * @apiParam {string} password 密码
 * 
 * @apiSuccess {String} code 状态码.
 * @apiSuccess {String} message  描述
 *
 * @apiSuccessExample Success-Response:
 *     HTTP/1.1 200 OK
 *     {
 *       "code": "10007||200||10008",
 *       "message": "该用户还未注册||登录成功||密码错误"
 *     }
 * @apiSampleRequest /api/users/login
 */
router.post('/login', (req, res, next) => {
  let {loginname, password} = req.body
  console.log(loginname,password)
  sql.find(User, { $or: [{ username: loginname}, 
    { tel: loginname }]}, { _id: 0, __v: 0}).then(data => {
      if (data.length === 0) {
        res.status(200).send({
          code: '10007',
          message: '该用户还未注册'
        })
      } else {
        utils.checkEncryption(password, data[0].password).then((result) => {
          if (result) {
            const token = utils.createToken({ tel: data[0].tel }, '就nm离谱', {
              expiresIn: 7 * 24 * 60 * 60 // 单位为 秒
            })
            res.status(200).send({
              code: '200',
              message: '登录成功',
              data: {
                username: data[0].username,
                token,
                userid: data[0].userid,
                nickname:data[0].nickname,
                avatar:data[0].avatar
              }
            })
          } else {
            res.status(200).send({
              code: '10008',
              message: '密码错误'
            })
          }
        })
      }
  })
  
})
module.exports = router